/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package redinftel.sesiones;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import redinftel.entidades.Usuario;

/**
 * Clase para el manejo de datos de la entidad Usuario.
 * @author Six Degrees Team
 */
@Stateless
public class UsuarioFacade extends AbstractFacade<Usuario> implements UsuarioFacadeRemote {
    @PersistenceContext(unitName = "redinftel-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UsuarioFacade() {
        super(Usuario.class);
    }

    @Override
    public List<Usuario> findUsuario(String email, String password) {
        return  em.createQuery("SELECT u FROM Usuario u WHERE u.email LIKE ?1 AND u.contrasenya LIKE ?2 AND u.estado LIKE 'ACTIVO'" )
                .setParameter(1, email).setParameter(2, password).getResultList();
        
    }

    @Override
    public BigDecimal findPK () {
        return (BigDecimal) em.createQuery("SELECT MAX(u.idUsuario) FROM Usuario u")
                .getSingleResult();
    }

    @Override
    public List<Usuario> findByCode(String codigo){
        return em.createQuery("Select u FROM Usuario u WHERE u.codigoValidacion LIKE ?1")
                .setParameter(1,codigo). getResultList();
    }

    @Override
    public int activarUsuario (String codigo, String contrasena){
        return em.createQuery("UPDATE Usuario u SET u.estado=\'ACTIVO\', u.contrasenya=?1 WHERE u.codigoValidacion LIKE ?2")
                .setParameter(1,contrasena)
                .setParameter(2,codigo)
                .executeUpdate();
    }
    @Override
    public List<Usuario> findAmigosMinusLista(Usuario idUsuarioCreador,String cadena) {
     HashSet <Usuario> lista =new HashSet<Usuario>(em.createQuery("SELECT u FROM Usuario u"
               + " INNER JOIN u.amistadCollection a1 WHERE (a1.idAmigo1 = ?2 OR  a1.idAmigo2 = ?2) AND u<> ?2"
               + " AND u.estado=\"ACTIVO\" AND (UPPER(u.perfil.nombre) LIKE ?3 OR UPPER(u.perfil.apellidos) LIKE ?3)")
               . setParameter(2, idUsuarioCreador).setParameter(3,"%"+cadena+"%").getResultList());
     lista.addAll(em.createQuery("SELECT u FROM Usuario u INNER JOIN u.amistadCollection1 a2"
               + " WHERE ( a2.idAmigo1 =?2 OR a2.idAmigo2 = ?2) AND u<> ?2"
               + " AND u.estado=\"ACTIVO\" AND (UPPER(u.perfil.nombre) LIKE ?3 OR UPPER(u.perfil.apellidos) LIKE ?3)").
               setParameter(2, idUsuarioCreador).
               setParameter(3,"%"+cadena+"%").getResultList());
     return new ArrayList<Usuario>(lista);
    }
    @Override
    public int reactivarUsuario (String codigo, String contrasena){
        return em.createQuery("UPDATE Usuario u SET u.estado=\'ACTIVO\' WHERE u.contrasenya LIKE ?1 AND u.codigoValidacion LIKE ?2")
                .setParameter(1,contrasena)
                .setParameter(2,codigo)
                .executeUpdate();
    }
    @Override
     public int borrarUsuario (String codigo, String contrasena){
        return em.createQuery("DELETE FROM Usuario u  WHERE u.contrasenya=?1 AND u.codigoValidacion LIKE ?2")
                .setParameter(1,contrasena)
                .setParameter(2,codigo)
                .executeUpdate();
    }
    @Override
  public int desactivarUsuario (String codigo, String contrasena){
        return em.createQuery("UPDATE Usuario u SET u.estado=\'INACTIVO\' WHERE u.contrasenya LIKE ?1 AND u.codigoValidacion LIKE ?2")
                .setParameter(1,contrasena)
                .setParameter(2,codigo)
                .executeUpdate();
    }
    @Override
    public List<Usuario> findByEmail(String email){
        return em.createQuery("Select u FROM Usuario u WHERE u.email LIKE ?1")
                .setParameter(1,email). getResultList();
    }

    @Override
    public List<Usuario> findByNombreApellidos(String nombre){
        List<Usuario> resultList = em.createQuery("Select u FROM Usuario u WHERE CONCAT(CONCAT(u.perfil.nombre,' '),u.perfil.apellidos) LIKE ?1 AND u.estado=\'ACTIVO\'").setParameter(1, nombre).getResultList();
        return resultList;
    }

}
